package br.com.sms.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;

import br.com.sms.conexao.Conexao;
import br.com.sms.dominio.Cidade;
import br.com.sms.dominio.Pessoa;
import br.com.sms.enuns.UF;

public class CidadeDAO {

	private EntityManager manager;
	private Conexao conexao;

	public CidadeDAO(){
		if(conexao == null)
			conexao = new Conexao();
	}


	@SuppressWarnings("unchecked")
	public List<String> getUfs(){
		manager = conexao.getEntityManger();
		Query query = manager.createQuery("select distinct c.uf from Cidade c");
		List<String> lista = query.getResultList();
		conexao.finalizaConexao();
		return lista;
	}


	@SuppressWarnings("unchecked")
	public List<Cidade> carregarCidades(UF uf) {
		manager = conexao.getEntityManger();
		Query query = manager.createQuery("select distinct c from Cidade c where c.uf = :uf");
		query.setParameter("uf", uf);
		List<Cidade> lista = query.getResultList();
		conexao.finalizaConexao();
		return lista;
	}

	public Cidade recuperarCidade(String nome, UF uf) {
		manager = conexao.getEntityManger();
		Query query = manager.createQuery("select c from Cidade c where c.nome = :nome and c.uf = :uf");
		query.setParameter("nome", nome);
		query.setParameter("uf", uf);
		
		Cidade cidade = null;
		
		try  {  
			cidade =  (Cidade) query.getSingleResult();
	    } catch ( NoResultException nre ) {  
		    return null;  
	    }finally{
	    	conexao.finalizaConexao();
	    }
	    
	    return cidade;
	}

	public Cidade recuperarCidade(Pessoa pessoa){
		if(pessoa.getCidade() != null && 
				pessoa.getCidade().getNome() != null &&
				pessoa.getCidade().getUf() != null){
			return recuperarCidade(pessoa.getCidade().getNome(), pessoa.getCidade().getUf());
		}
		
		return null;
	}

	public Cidade salvar(Cidade cidade) {
		manager = conexao.getEntityManger();
		manager.getTransaction().begin();
		manager.persist(cidade);
		manager.getTransaction().commit();
		conexao.finalizaConexao();
		return cidade;
	}


	public Cidade recuperarCidade(String nomeCidade) {
		manager = conexao.getEntityManger();
		Query query = manager.createQuery("select c from Cidade c where c.nome = :nome");
		query.setParameter("nome", nomeCidade.toUpperCase());
		
		Cidade cidade = null;
		
		try  {  
			cidade =  (Cidade) query.getSingleResult();
	    } catch ( NoResultException nre ) {  
		    return null;  
	    }finally{
	    	conexao.finalizaConexao();
	    }
	    
	    return cidade;
	}
}
